package com.yuanqiao.interfaceforlc.uploadmatterandfile.controller;

import com.alibaba.druid.sql.visitor.functions.If;
import com.alibaba.fastjson.JSON;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.PdfWriter;
import com.yuanqiao.interfaceforlc.uploadmatterandfile.config.config;
import com.yuanqiao.interfaceforlc.uploadmatterandfile.service.uploadService;
import com.yuanqiao.interfaceforlc.uploadmatterandfile.util.WorderToNewWordUtils;
import com.yuanqiao.interfaceforlc.uploadmatterandfile.util.jpgtopdfUtil;
import com.yuanqiao.interfaceforlc.uploadmatterandfile.util.margepdfUtil;
import com.yuanqiao.interfaceforlc.uploadmatterandfile.util.wordtopdfUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.List;

@Controller
public class uploadImpl implements upload {
    @Autowired
    private uploadService uploadservice;
    @Autowired
    private config config;

    @Override
    public List uploadmatterandfile(String uploadtype, String serialNo, String docId, String docNo, String fileId, String fileNo, @RequestPart("file")MultipartFile[] files) throws IOException {
        List list=new ArrayList();  //TYPE  FILED
        int i=0;
        for(MultipartFile file: files) {
            i++;
            Map map = new HashMap<>(3);
            String name = file.getOriginalFilename();   //上传文件的真实名称
            String suffixName = name.substring(name.lastIndexOf(".")+1);  //获取后缀名
            if ("jpg".equals(suffixName) || "tiff".equals(suffixName)) {   //验证分辨率
                BufferedImage image = ImageIO.read(file.getInputStream());
                if (image.getHeight() > Integer.parseInt(config.getUpload_resolving_power_max_height()) || image.getHeight() < Integer.parseInt(config.getUpload_resolving_power_min_height())||image.getWidth()>Integer.parseInt(config.getUpload_resolving_power_max_width())||image.getWidth()<Integer.parseInt(config.getUpload_resolving_power_min_width())) {  //判断图片是否是在分辨率范围内，非水平分辨率，非垂直分辨率
                    map.put("name",name);
                    map.put("result", "false");
                    map.put("mes", "分辨率错误!");
                    map.put("url", "");
                    list.add(map);
                    //datamap.put(name,map);
                    break;
                }


            }
            if (!"jpg".equals(suffixName) && !"tiff".equals(suffixName) && !"docx".equals(suffixName) && !"pdf".equals(suffixName)) {  //验证文件类型
                map.put("name",name);
                map.put("result", "false");
                map.put("mes", "上传文件格式仅支持jpg/tiff/docx/pdf!");
                map.put("url", "");
                list.add(map);
                //datamap.put(name,map);
                break;
            }
            if("f".equals(uploadtype)){     //如果是文件,文件主键相同时删除原文件,删除表中记录
                String url=uploadservice.getfileString(serialNo,docId,fileId);  //获取文件url
                if(url!=null){
                    File needdeletefile=new File(url);
                    if(needdeletefile.isFile() && needdeletefile.exists()) {
                        needdeletefile.delete();
                    }
                    uploadservice.deletesamefileIddile(serialNo,docId,fileId);  //删除表中记录
                }
            }
            String path = config.getUpload_url()  + serialNo + "/"+docId+"/"+fileId+"/" + uploadtype;//存储位置(配置文件中)+业务主键+材料主键+文件主键+type
            File tempFile = new File(path + "/" + name);
            //判断路径是否存在，没有就创建一个
            if (!tempFile.getParentFile().exists()) {
                tempFile.getParentFile().mkdirs();
            }
            try {
                file.transferTo(tempFile.toPath());
            } catch (IOException e) {
                e.printStackTrace();
            }
            Date date=new Date();
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String time=sdf.format(date);
            int num=uploadservice.savemandf(uploadtype,serialNo,docId,docNo,fileId,fileNo,path+"/"+name,time);
            if(num>0){
                map.put("name",name);
                map.put("result", "true");
                map.put("mes", "成功!");
                map.put("url", path + File.separator + name);
                list.add(map);
                //datamap.put(name,map);
            }else{
                map.put("name",name);
                map.put("result", "false");
                map.put("mes", "失败!");
                map.put("url", "");
                list.add(map);
                //datamap.put(name,map);
            }
        }
        System.out.println(list.toString());
        return list;
    }

    @Override
    public boolean deletefile(String id) {
        String url=uploadservice.geturlbyfileid(id);
        int result=uploadservice.deletefile(id);
        boolean returnresult=false;
        if (result>0){
            returnresult=true;
            if(url!=null) {
                File needdeletefile = new File(url);
                if (needdeletefile.isFile() && needdeletefile.exists()) {
                    needdeletefile.delete();
                }
            }
        }
        return returnresult;
    }

    @Override
    public String composePDF(String serialNo, String fileId) {
        List oldfileurllist=uploadservice.queryAllfile(serialNo);
        List<String> newfilelist=new ArrayList<>(oldfileurllist.size());
        SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyyMMddHHmmssSSS");
        //获取当前时间并作为时间戳
        String timeStamp=simpleDateFormat.format(new Date());
        for (int i = 0; i < oldfileurllist.size(); i++) {
            String type=oldfileurllist.get(i).toString().substring(oldfileurllist.get(i).toString().lastIndexOf(".")+1,oldfileurllist.get(i).toString().length());
            System.out.println("第"+i+"个文佳是:"+type+"类型");
            if ("pdf".equals(type)){    //如果是pdf类型
                try{
                    File oldfile=new File(oldfileurllist.get(i).toString());
                    File newfile=new File(config.getTrans_url()+serialNo+"/"+timeStamp+"/"+i+".pdf");
                    if (!newfile.getParentFile().exists()) {
                        newfile.getParentFile().mkdirs();
                    }
                    newfilelist.add(config.getTrans_url()+serialNo+"/"+timeStamp+"/"+i+".pdf");
                    //"r"表示：只读--输入流，只读就可以。
                    RandomAccessFile randomAccessFile1 = new RandomAccessFile(oldfileurllist.get(i).toString(),"r");
                    //"rw"表示：读、写--输出流，需要读、写。
                    RandomAccessFile randomAccessFile2 = new RandomAccessFile(config.getTrans_url()+serialNo+"/"+timeStamp+"/"+i+".pdf","rw");

                    // 获得FileChannel管道对象
                    FileChannel fileChannel1 = randomAccessFile1.getChannel();
                    FileChannel fileChannel2 = randomAccessFile2.getChannel();

                    // 获取文件的大小
                    long size = fileChannel1.size();

                    // 直接把硬盘中的文件映射到内存中
                    MappedByteBuffer mappedByteBuffer1 = fileChannel1.map(FileChannel.MapMode.READ_ONLY, 0, size);
                    MappedByteBuffer mappedByteBuffer2 = fileChannel2.map(FileChannel.MapMode.READ_WRITE, 0, size);

                    // 循环读取数据
                    for (long j = 0; j < size; j++) {
                        // 读取字节
                        byte byt = mappedByteBuffer1.get();
                        // 保存到第二个数组中
                        mappedByteBuffer2.put(byt);
                    }
                    // 释放资源
                    fileChannel2.close();
                    fileChannel1.close();
                    randomAccessFile2.close();
                    randomAccessFile1.close();
                    System.gc();
                }catch (IOException e){
                    e.printStackTrace();
                }

            }else if ("tiff".equals(type)){//如果是tiff类型
                try {
                    String imagePath = oldfileurllist.get(i).toString();
                    String pdfPath = config.getTrans_url()+serialNo+"/"+timeStamp+"/"+i+".pdf";
                    File newfile=new File(config.getTrans_url()+serialNo+"/"+timeStamp+"/"+i+".pdf");
                    if (!newfile.getParentFile().exists()) {
                        newfile.getParentFile().mkdirs();
                    }
                    BufferedImage img = ImageIO.read(new File(imagePath));

                    FileOutputStream fos = new FileOutputStream(pdfPath);
                    Document doc = new Document(null, 0, 0, 0, 0);
                    doc.setPageSize(new Rectangle(img.getWidth(), img.getHeight()));
                    Image image = Image.getInstance(imagePath);
                    PdfWriter.getInstance(doc, fos);
                    doc.open();
                    doc.add(image);
                    doc.close();
                    System.gc();
                    newfilelist.add(config.getTrans_url()+serialNo+"/"+timeStamp+"/"+i+".pdf");
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (BadElementException e) {
                    e.printStackTrace();
                } catch (DocumentException e) {
                    e.printStackTrace();
                }
            }else if("docx".equals(type)){//如果是docx类型
                String pdfPath = config.getTrans_url()+serialNo+"/"+timeStamp+"/"+i+".pdf";
                File newfile=new File(config.getTrans_url()+serialNo+"/"+timeStamp+"/"+i+".pdf");
                if (!newfile.getParentFile().exists()) {
                    newfile.getParentFile().mkdirs();
                }
                try {
                    wordtopdfUtil.trans(oldfileurllist.get(i).toString(),pdfPath);
                    newfilelist.add(config.getTrans_url()+serialNo+"/"+timeStamp+"/"+i+".pdf");
                    System.gc();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }else if ("jpg".equals(type)){//如果是jpg类型
                jpgtopdfUtil img = new jpgtopdfUtil();
                img.imgOfPdf(config.getTrans_url()+serialNo+"/"+timeStamp+"/"+i+".pdf",oldfileurllist.get(i).toString());
                newfilelist.add(config.getTrans_url()+serialNo+"/"+timeStamp+"/"+i+".pdf");
            }
        }
        //System.out.println("newfilelist===="+newfilelist);
        Map margepdfmap=margepdfUtil.mergepdf(newfilelist,config.getMarge_url()+serialNo+"/");
        if("ok".equals(margepdfmap.get("result"))){
            //合成总pdf成功,插入数据库数据
            int num= uploadservice.insertmargePDF(fileId,margepdfmap.get("url").toString());
            if (num>0){
                return margepdfmap.get("url").toString();
            }else{
                margepdfmap.put("mes","转换成功但插入数据库失败!");
                return margepdfmap.get("mes").toString();
            }

        }else{
            return margepdfmap.get("mes").toString();
        }
    }

    @Override
    public String modeltoPDF(String serialNo, String docId, String docNo, String fileId, String fileNo) {
        String data="{\"ProcInfo\":{\"SerialNo\":\"d83be3d1ea804b8a96e2a12ed99b38be（业务主键）\",\"AppNum\":\"1600000001（网上申请号）\",\"FormDate\":\"2016-01-01 10:30:24（生成时间）\",\"BizTypeCode\":\"20（业务类型：20设立，30变更，51简易注销，53一般注销）\",\"BigEntType\":\"HHQY\",\"AgentName\":\"小刚（经办人）\",\"AgentCertTypeCode\":\"10（经办人证件类型代码）\",\"AgentCertType\":\"中华人民共和国居民身份证（经办人证件类型）\",\"AgentCertNum\":\"4413231122303000202（经办人证件号码）\",\"AgentPhone\":\"13500000001（经办人手机号）\",\"AgentEmail\":\"123@qq.com（经办人电子邮箱）\"},\"BaseInfo\":{\"EntID\":\"440301001012011111804978（主体身份代码）\",\"EntName\":\"某某有限责任公司（企业名称）\",\"EntRegNO\":\"440301998898888（注册号）\",\"EntSCCode\":\"91440300444060849H（统一社会信用代码）\",\"NameRegNO\":\"201584000098217（名称证编号）\",\"AuthDate\":\"2020-01-01（核准日期）\",\"RegorgCode\":\"150000000（登记机关代码）\",\"Regorg\":\"内蒙古市场监督管理局（登记机关）\",\"EntTypeCode\":\"1100（主体类型代码）\",\"EntType\":\"有限责任公司（主体类型）\",\"AddrProCode\":\"150000（住所省代码）\",\"AddrPro\":\"内蒙古自治区（住所省）\",\"AddrCityCode\":\"150100（住所市代码）\",\"AddrCity\":\"呼和浩特市（住所市）\",\"AddrCouCode\":\"150102（住所区代码）\",\"AddrCou\":\"新城区（住所区）\",\"AddrDetail\":\"哇哇街道100号（除了行政区划与街道外的地址）\",\"Addr\":\"内蒙古自治区呼和浩特市新城区哇哇街道100号（住所）\",\"BizAddrProCode\":\"150000（经营地址省代码）\",\"BizAddrPro\":\"内蒙古自治区（经营地址省）\",\"BizAddrCityCode\":\"150100（经营地址市代码）\",\"BizAddrCity\":\"呼和浩特市（经营地址市）\",\"BizAddrCouCode\":\"150102（经营地址区代码）\",\"BizAddrCou\":\"新城区（经营地址区）\",\"BizAddrDetail\":\"哇哇街道100号（除了行政区划与街道外的地址）\",\"BizAddr\":\"内蒙古自治区呼和浩特市新城区哇哇街道100号（经营地址）\",\"PostCode\":\"518001（邮政编码）\",\"RegiContPhonNumb\":\"13500000001（联系电话）\",\"CancelDate\":\"10（注销原因编码）\",\"DeregReason\":\"被依法宣告破产（注销原因）\",\"Empnum\":\"100（从业人数）\",\"RegCapCurrencyCode\":\"142（认缴出资总额币种代码）\",\"RegCapCurrency\":\"人民币（认缴出资总额币种）\",\"RegCap\":\"100（认缴出资总额万元）\",\"InvCap\":\"100（投资总额）\",\"InvCapCurrencyCode\":\"142（投资总额币种代码）\",\"InvCapCurrency\":\"人民币（投资总额币种）\",\"InvDollarCap\":\"100（投资总额折美元）\",\"OpYear\":\"100（营业年限，如为空则永久经营）\",\"CptAmt\":\"1（副本数）\",\"HasBOD\":\"1（是否设立董事会，1:是，0:否）\",\"HasBOS\":\"1（是否设立监事会，1:是，0:否）\",\"OpScope\":\"货物及技术进出口（法律、行政法规禁止的项目除外；法律、行政法规限制的项目须取得许可后方可经营）。（经营范围）\",\"IndustryPhy\":\"A(行业门类代码)\",\"IndClassCode\":\"0131(行业明细代码)\",\"IndClass\":\"棉花的种植(行业明细)\",\"LeRepName\":\"张三(法定代表人、负责人、经营者、执行事务合伙人姓名)\",\"LeRepPhone\":\"13500000012(法定代表人、负责人、经营者、执行事务合伙人移动电话)\",\"LeRepTel\":\"83070000(法定代表人、负责人、经营者、执行事务合伙人固定电话)\",\"LeRepEmail\":\"dddd@qq.com(法定代表人、负责人、经营者、执行事务合伙人电子邮箱)\",\"LeRepCertTypeCode\":\"10(法定代表人、负责人、经营者、执行事务合伙人证件类型代码)\",\"LeRepCertType\":\"中华人民共和国居民身份证(法定代表人、负责人、经营者、执行事务合伙人证件类型)\",\"LeRepCertNum\":\"441321232332323232(法定代表人、负责人、经营者、执行事务合伙人证件号码)\",\"LeRepCountryCode\":\"156(国别地区代码)\",\"LeRepCountry\":\"中国(国别地区)\",\"LeRepPositionCode\":\"431A(职务代码)\",\"LeRepPosition\":\"董事长(职务)\",\"LeRepPostmodeCode\":\"01(产生方式代码)\",\"LeRepPostmode\":\"任命(产生方式)\",\"LeRepPostalCode\":\"250000(邮政编码)\",\"LeRepOccupstatus\":\"工程师(经营者职业状况)\",\"LeRepEducatedCode\":\"(经营者文化程度代码)\",\"LeRepEducated\":\"本科(经营者文化程度)\",\"LeRepNationCode\":\"(经营者民族代码)\",\"LeRepNation\":\"汉族(经营者民族)\",\"LeRepCerissdate\":\"2009-01-01(经营者证件签发期)\",\"LeRepCervalper\":\"2029-01-01(经营者证件有效期)\",\"LeReAddr\":\"内蒙古自治区呼和浩特市新城区哇哇街道100号(法定代表人、负责人、经营者、执行事务合伙人、首席代表住所)\",\"LinkmanName\":\"张三（联络员姓名）\",\"LinkmanPhone\":\"13500000012(联络员移动电话)\",\"LinkmanTel\":\"83070000(联络员固定电话)\",\"LinkmanEmail\":\"dddd@qq.com(联络员电子邮箱)\",\"LinkmanCertTypeCode\":\"10(联络员证件类型代码)\",\"LinkmanCertType\":\"中华人民共和国居民身份证(联络员证件类型)\",\"LinkmanCertNum\":\"441321232332323232(联络员证件号码)\",\"TaxName\":\"张三（财务负责人姓名）\",\"TaxPhone\":\"13500000012(财务负责人移动电话)\",\"TaxTel\":\"83070000(财务负责人固定电话)\",\"TaxEmail\":\"dddd@qq.com(财务负责人电子邮箱)\",\"TaxCertTypeCode\":\"10(财务负责人证件类型代码)\",\"TaxCertType\":\"中华人民共和国居民身份证(财务负责人证件类型)\",\"TaxCertNum\":\"441321232332323232(联络员证件号码)\",\"LegelSerName\":\"小王（法律文书送达人）\",\"LegelSerPhone\":\"13500000012(法律文书送达人移动电话)\",\"LegelSerTel\":\"83070000(法律文书送达人固定电话)\",\"LegelSerEmail\":\"dddd@qq.com(法律文书送达人电子邮箱)\",\"LegelSerAddr\":\"内蒙古自治区呼和浩特市新城区哇哇街道100号(法律文书送达人住所)\",\"AgencyName\":\"小李（委托代理人姓名）\",\"AgencyPhone\":\"13500000012(委托代理人移动电话)\",\"AgencyTel\":\"83070000(委托代理人固定电话)\",\"AgencyMaterial\":\"（是否同意核对登记材料中的复印件并签署核对意见）\",\"AgencyFile\":\"（是否同意修改企业自备文件的错误）\",\"AgencyTable\":\"（是否同意修改有关表格的填写错误）\",\"AgencyDocument\":\"（是否同意领取营业执照和有关文书）\"},\"SubInfo\":{\"SubName\":\"内蒙古代表处（隶属企业名称、外国地区企业）\",\"SubEngName\":\"（外国地区企业英文名）\",\"SubAddr\":\"（住所）\",\"linkman\":\"（有限签字人姓名）\",\"opfrom\":\"（存续期限自）\",\"opto\":\"（存续期限至）\",\"CapNum\":\"100（资本，万美元）\",\"SubScope\":\"XXXXX（经营范围）\",\"SubCountryCode\":\"156（国别）\",\"SubCountry\":\"中国（国别）\",\"RespType\":\"（责任形式）\"},\"BoardInfo\":[{\"Name\":\"小明（姓名或名称）\",\"CertTypeCode\":\"10（证件类别代码）\",\"CertType\":\"中华人民共和国居民身份证（证件类别）\",\"CertNum\":\"441323445454555545（证件号码）\",\"BoardCountryCode\":\"156（国籍代码）\",\"BoardCountry\":\"中国（国籍）\",\"PositionCode\":\"434Q（职务代码）\",\"Position\":\"总经理（职务名称）\",\"ApptFormCode\":\"01（产生方式代码)）\",\"ApptForm\":\"任命（产生方式）\",\"BoardAddr\":\"xxx街道（住所）\"}],\"SHInfo\":[{\"Name\":\"小米（姓名）\",\"Subconam\":\"10（认缴出资额，万元）\",\"Acconam\":\"10（实缴出资额，万元）\",\"CapProp\":\"10（出资比例）\",\"CertTypeCode\":\"10（证件类别代码）\",\"CertType\":\"中华人民共和国居民身份证（证件类别）\",\"CertNum\":\"441323445454555545（证件号码）\",\"ResponwayCode\":\"1（承担责任方式代码）\",\"Responway\":\"有限责任（承担责任方式）\",\"CountryCode\":\"156（国别代码）\",\"Country\":\"中国（国别）\",\"Condate\":\"2020-01-01（出资时间）\",\"Conform\":\"货币（出资方式,用逗号隔开）\",\"SHAddr\":\"xxx街道（住所）\"}],\"AlterItemInfo\":[{\"AlterItemCode\":\"01(变更事项代码)\",\"AlterItem\":\"名称(变更事项名称)\",\"AlterBef\":\"哇哇公司(变更前)\",\"AlterAft\":\"啦啦公司(变更后)\"}]}";
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date=new Date();
        String time=sdf.format(date);
        String datefileurl=config.getModel_to_pdf()+time+"/"+serialNo+"/"+docId+"/"+fileId+"/"+time+".docx";
        String modelurl="";
        Map<String,Map<String,String>> map= JSON.parseObject(data,HashMap.class);
        String BizTypeCode=map.get("ProcInfo").get("BizTypeCode");
        String BigEntType=map.get("ProcInfo").get("BigEntType");
        String EntTypeCode=map.get("BaseInfo").get("EntTypeCode");
        String HasBOS=map.get("BaseInfo").get("HasBOS");
        String HasBOD=map.get("BaseInfo").get("HasBOD");
        String PositionCode=map.get("BaseInfo").get("PositionCode");
        try {
        if (!"GS".equals(BigEntType)) {
            String url=uploadservice.chooseshenqingshu(BigEntType);
            modelurl=Thread.currentThread().getContextClassLoader().getResource("").getPath()+"model/申请书/"+url;
            System.out.println("modelurl=="+modelurl);
        }else{
            if ("1".equals(HasBOD)&&"0".equals(HasBOS)&&EntTypeCode.startsWith("11")&&!"1151,1152,1153".contains(EntTypeCode)){
                modelurl=ResourceUtils.getFile("classpath:model/章程/有限责任公司章程参考格式（设董事会、不设立监事会）.docx").toString();
            }else if (!"432K".equals(PositionCode)&&!"1".equals(HasBOD)){
                modelurl=ResourceUtils.getFile("classpath:model/申请书/公司登记（备案）申请书.doc").toString();
            }else if ("432K".equals(PositionCode)&&"1151,1152,1153".contains(EntTypeCode)){
                modelurl=ResourceUtils.getFile("classpath:model/章程/有限责任公司章程参考格式（一人公司，设执行董事、监事）.doc").toString();
            }else if ("432K".equals(PositionCode)&&EntTypeCode.startsWith("11")&&!"1151,1152,1153".contains(EntTypeCode)){

                    modelurl= ResourceUtils.getFile("classpath:model/章程/有限责任公司章程参考格式（设执行董事、监事）.doc").toString();

            }else{
                modelurl="";
            }
        }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        WorderToNewWordUtils.datetomodel(datefileurl,data,modelurl);
        return null;
    }

}
